Moxa DLM On‑Premises has two software components, downloaded as two separate packages on the Moxa website:
This single guide covers both. It handles first‑time installation and upgrading from v1.1, and explains how to update the DLM Agent from the DLM Server using Run Custom Script. The parts below are self‑contained, so you can jump straight to the one you need.
| You are… | Go to |
|---|---|
| Standing up a new DLM Server (or upgrading one) | Part 1 — DLM Server |
| Installing the Agent on UC devices for the first time | Part 2 — DLM Agent |
| Updating the Agent already on devices | Part 3 — Update the Agent |
| Checking status / troubleshooting a device | Part 4 — Verify & Troubleshoot |
The Agent depends on the Server: before enrolling devices you need the Server's FQDN, a Provisioner account, and (optionally) the server certificate. If you only received the Agent package, see Before you start at the top of Part 2.
DLM components are versioned independently — the Agent version does not match the Server version (this release: Server 1.2.0, Agent 1.1.0 / 2.1.4). Use the table below to pick the correct Agent build for each device.
| Component | Version (this release) | File |
|---|---|---|
| DLM Server | 1.2.0 (build 88) | dlm-1.2.0-build.88.tar.gz |
| DLM Agent — UC‑8200, MIL 3 | 1.1.0‑1 | DLM_Agent_MIL3_UC-8200 |
| DLM Agent — UC‑1200A/2200A/3400A/4400A/8600A, MIL 3 | 1.1.0‑1 | DLM_Agent_MIL3_UC-1200A-2200A-3400A-4400A-8600A |
| DLM Agent — UC‑1200A/2200A/3400A/4400A/8600A, MIL 4 | 2.1.4‑1 | DLM_Agent_MIL4_UC-1200A-2200A-3400A-4400A-8600A |
Pick the Agent by the device's model and MIL major version — not by the Server version. MIL 3 devices use Agent 1.1.0; MIL 4 devices use Agent 2.1.4. See How to choose the right Agent build.
dlm-1.2.0-build.88.tar.gz downloaded from the Moxa website.Strongly recommended: use an FQDN (not a bare IP) for the server. The FQDN is asked for only at first install; you can later change the host's IP without re‑registering any device.
A checksum file (dlm-1.2.0-build.88.tar.gz.sha) ships alongside the installer. Verify before installing:
sha1sum -c dlm-1.2.0-build.88.tar.gz.sha
# Expected output:
# dlm-1.2.0-build.88.tar.gz: OK
# 1) Set the file name you received
DLM_FILENAME=dlm-1.2.0-build.88.tar.gz
# 2) Extract into /usr/local
sudo tar zxvf ${DLM_FILENAME} -C /usr/local
# 3) Register the local apt repo
echo "deb [trusted=yes] file:/usr/local/moxa-dlm-local-apt-repo jammy/" \
| sudo tee /etc/apt/sources.list.d/moxa-dlm.list
# 4) Refresh apt and install
sudo apt-get update
sudo apt-get install dlm
The DLM Text User Interface (TUI) opens automatically and runs a system‑requirements check (CPU, memory, disk, OS, package dependencies, network):
| Result | Meaning |
|---|---|
| ✅ Info | Meets all recommended requirements — installation continues automatically. |
| ⚠️ Warning | Meets only the minimal requirements — you may press Y to continue. |
| ⛔ Alert | Below minimum — installation will not proceed. |
Then:
1. Enter the FQDN when prompted (first install only).
2. Create the default administrator account. Default password: admin@123.
3. When done, open the web console at https://YOUR_FQDN.
NOTE — offline installs: if the server previously ran apt-get update online, add
--no-install-recommends:
sudo apt-get install dlm --no-install-recommends
WARNING — unsupported architectures: if apt-get update complains about armhf/i386,
remove those foreign architectures first, then reinstall.
Reinstalling: uninstall the current version first, otherwise you may hit
Errors were encountered while processing … needrestart is being skipped since dpkg has failed.
Upgrading reuses your existing configuration and keeps all registered devices.
Back up the DLM database. DLM has a built-in backup tool (User Manual §8 Backup and Recovery).
dlm backup # creates an encrypted backup file → dlm-backup-YYYYMMDDxxxx.tgz.enc
dlm verify-backup dlm-backup-XXXX.tgz.enc # confirm the backup is valid
Store the encrypted file off the server. For cloud/VM hosts, also take a VM snapshot.
Stop the DLM service (required before upgrade):
sudo systemctl stop dlmg2
Run the same install commands as §1.3 with the v1.2 file:
DLM_FILENAME=dlm-1.2.0-build.88.tar.gz
sudo tar zxvf ${DLM_FILENAME} -C /usr/local
echo "deb [trusted=yes] file:/usr/local/moxa-dlm-local-apt-repo jammy/" \
| sudo tee /etc/apt/sources.list.d/moxa-dlm.list
sudo apt-get update
sudo apt-get install dlm
https://YOUR_FQDN.admin@123.DLM ships with no default enrollment account, so before enrolling any device you must create one. Create a low‑privilege Provisioner user for this. A Provisioner can register devices but cannot log in to the web console or API — so the enrollment credentials placed on devices can't be used to reach your data.
DLM Agent ships as a separate download (Software Package for DLM Agent). It is not pre‑installed on UC computers — you install it and point it at your DLM Server.
Whoever installs agents needs three things from the DLM Server side (Part 1):
| Need | Where it comes from |
|---|---|
| Server FQDN | the address set at server install — goes into user.yaml (§2.3) |
| Provisioner account (email + password) | create it on the server (§1.5) — goes into credentials.yaml (§2.4) |
| Server certificate (optional) | only when validating the server identity (§2.5) |
The device must also be able to reach the Server over the network (ping YOUR_FQDN).
Pick the package by your device model and its MIL version. The model is on the device label; to confirm the MIL version, run on the device:
mx-ver -M # MIL major version, e.g. 3.4.1 or 4.0.x
| Device model | Device MIL | Use this Agent package | Agent version |
|---|---|---|---|
| UC‑8200 | MIL 3 (≥ 3.4.1) | DLM_Agent_MIL3_UC-8200 |
1.1.0‑1 |
| UC‑1200A / 2200A / 3400A / 4400A / 8600A | MIL 3 (≥ 3.4.1) | DLM_Agent_MIL3_UC-1200A-2200A-3400A-4400A-8600A |
1.1.0‑1 |
| UC‑1200A / 2200A / 3400A / 4400A / 8600A | MIL 4 | DLM_Agent_MIL4_UC-1200A-2200A-3400A-4400A-8600A |
2.1.4‑1 |
The same models appear under both MIL 3 and MIL 4 — the MIL version is what decides which to use,
so check mx-ver -M if unsure.
The installer stops with a clear message if you pick the wrong package: it checks that the device's MIL major version matches the package (MIL 3 vs MIL 4 — different Debian base, so the wrong one would fail to install / run), that the device meets the minimum MIL patch level (MIL 3 ≥ 3.4.0), and that the package's CPU architecture matches the device (UC‑8200 = armhf/32‑bit; the others = arm64/64‑bit).
Each Agent package is organised by task, so you use the folder that matches what you want to do:
<agent package>/
├── 1_First_Time_Install/ ← install on a NEW (not yet enrolled) device
│ ├── run (guarded install/enroll script)
│ ├── user.yaml (EDIT: dlmServer.host)
│ ├── credentials.yaml (EDIT: enrollment account)
│ ├── moxa-dlm-agent_*.deb
│ └── MIL_packages/
├── 2_Update_On_Device/ ← update an ALREADY-enrolled device, locally on the device
│ ├── update_agent.sh (keeps enrollment & credentials)
│ ├── moxa-dlm-agent_*.deb
│ └── MIL_packages/
├── 3_Update_From_DLM_Server/ ← update from the DLM web console (Run Custom Script)
│ ├── dlm_agent_update.sh
│ └── dlm-agent-update_*.tar (agent + MIL components, ready to upload)
└── Troubleshooting/
└── collect_dlm_logs.sh
| Your task | Use this folder |
|---|---|
| New device, first install | 1_First_Time_Install → §2.3 onward |
| Update an enrolled device, on the device | 2_Update_On_Device → §3.2 |
| Update an enrolled device, from the server | 3_Update_From_DLM_Server → §3.1 |
Safety: the 1_First_Time_Install/run script will refuse to run on a device that is
already enrolled — interactively it warns and asks to confirm (because continuing re-enrolls
the device); run unattended (automation) it stops. To update an enrolled device, use
folder 2 or 3, which never touch the existing enrollment or credentials.
user.yamlThis file is copied to /etc/moxa/moxa-dlm-agent/user.yaml during install; the Agent reads its
settings from there.
# Mandatory
dlmServer:
host: "demo.dlm.moxa" # DLM Server FQDN — do NOT include the https:// prefix
# Optional
security:
skipTLSVerify: true # see table below
dataTransmission:
trafficUsageDebug:
enabled: false
interval: "10m0s"
cellularPerformanceDebug:
enabled: true
interval: "10m0s"
events:
cpuTemperature:
threshold: 0
| Field | Values |
|---|---|
dlmServer.host |
FQDN of the target DLM Server, e.g. demo-xxxx.dlm.dev.moxa.live. No https:// prefix. |
security.skipTLSVerify |
true (default) = skip server‑certificate validation. false = validate the server identity using cert.pem (see §2.5). |
dataTransmission.trafficUsageDebug.enabled |
true = report per‑interface TX/RX at the interval. false (default) = don't report traffic. |
dataTransmission.cellularPerformanceDebug.enabled |
true (default) = report cellular signal/quality (level, RSRP, RSRQ, SINR, ECI). false = don't report. |
…interval |
Minimum 10s. Format 1h0m0s (d/h/m/s). |
events.cpuTemperature.threshold |
0 (default) = hardware auto‑shutdown temp minus 10 °C. 1–150 = explicit °C. e.g. 90 fires CPU Temperature Too High at 90 °C. |
credentials.yamlThe account used to enroll the device. There is no default enrollment account — you must first create a Provisioner account on the server (§1.5), then put its email/password here. The values below are placeholders, not real defaults.
email: "provisioner@moxa.com"
password: "provisioner@123"
The account must exist on the server before enrollment. After the device enrolls, this file is encrypted on the device to protect the password.
For higher security, have the device verify the server's identity:
user.yaml, set security.skipTLSVerify: false.run and user.yaml, named cert.pem:
/var/lib/dlm/data/certs/root/cert.pem ← on the DLM Server
(The installer will refuse to proceed if skipTLSVerify: false but cert.pem is missing.)Use the 1_First_Time_Install/ folder. Make sure the device can reach the server (ping YOUR_FQDN).
On the device console, from the 1_First_Time_Install/ folder:
cd 1_First_Time_Install
chmod +x run
sudo ./run
If the device is already enrolled, run will warn and (interactively) ask before
re-enrolling, or stop if run unattended. That's expected — use 2_Update_On_Device to
update an enrolled device instead. To deliberately re-enroll, run sudo ./run --reinstall.
When finished, verify with mx-dlm-agent status (Part 4).
Always use the dlm_agent_update.sh that ships with each release. An Agent update may
also carry MIL component updates, and the script content can differ between releases.
Use this when the device is already connected to the DLM Server.
Update the Agent together with its MIL companions. Each Agent build is released with
the specific Moxa Connection Manager (and, on MIL 4, Moxa Edge + moxa-version)
versions it depends on. Updating only moxa-dlm-agent*.deb leaves those on old versions and
can cause mismatches — so the update must install the agent and its MIL_packages together.
🛡️ The update scripts also refuse to run if the bundle's MIL major or CPU architecture does not match the device (e.g. pushing a MIL 4 bundle to a MIL 3 device) — so a wrong selection in a mixed fleet stops with a clear message instead of breaking the device.
3_Update_From_DLM_Server/ folder for the device's model/MIL
(§2.1). It contains two files — no extra packaging needed:
dlm_agent_update.shdlm-agent-update_*.tar — agent + MIL components, pre-packageddlm_agent_update.sh as the Shell Script and the matching
dlm-agent-update_*.tar as the additional file, then click Confirm.dlm_agent_update.sh
✕
dlm-agent-update_mil4_arm64_2.1.4.tar
✕
After the script completes, the DLM Agent service restarts automatically (~5 s delay so the
current session isn't cut off). Re‑check with mx-dlm-agent status after about 30 s.
If the device is not connected to the server (or you prefer a local update), use the
2_Update_On_Device/ folder. It upgrades the agent + MIL components and keeps the
existing enrollment and credentials (it does not re-enroll).
On the device console:
cd 2_Update_On_Device
chmod +x update_agent.sh
sudo ./update_agent.sh
Do not use 1_First_Time_Install/run to update an enrolled device — it would re-enroll it.
(The script guards against this, but folder 2 is the correct tool for updates.)
mx-dlm-agent status
| Status | What it means | What to do |
|---|---|---|
init |
Agent is initializing and trying to reach the server. Stuck here = it can't reach the server. | Check network/Internet; verify dlmServer.host in user.yaml (correct FQDN, no https://). |
enroll |
Enrollment requested; waiting for the server to return the enrollment certificate. | Normal transient state — wait. |
pending approval |
Got the certificate and requested registration; waiting for an admin to approve. | Approve the device in Device Approval on the web console. |
provisioning |
Admin approved; the server is applying settings. | Normal — wait for it to finish. |
connecting |
The device is establishing its connection to the server. | Normal transient state. |
connected |
✅ The device is connected and managed. | Done. |
disconnected |
The device lost its connection to the server. | Check network and systemctl status moxa-dlm-agent. |
error |
An unidentified error occurred during enrollment/registration. | See §4.2. |
systemctl status moxa-dlm-agent
Common causes: wrong credentials/password, malformed user.yaml, or a configuration error.sudo ./collect_dlm_logs.sh
# Produces /tmp/dlm-logs-<host>-<timestamp>.tar.gz — attach it to your support case.| Item | Value |
|---|---|
| Server package | dlm-1.2.0-build.88.tar.gz (verify: sha1sum -c …tar.gz.sha) |
| Server install dir | /usr/local/moxa-dlm-local-apt-repo |
| Agent config dir | /etc/moxa/moxa-dlm-agent/ (user.yaml, cert.pem, private/credentials.enc) |
| Server certificate | /var/lib/dlm/data/certs/root/cert.pem |
| Default admin password | admin@123 (change on first login) |
| Status command | mx-dlm-agent status |
| Service | systemctl status moxa-dlm-agent |
| Log collector | <agent package>/Troubleshooting/collect_dlm_logs.sh |
| Server‑side updater | <agent package>/3_Update_From_DLM_Server/dlm_agent_update.sh (+ dlm-agent-update_*.tar) |
| Local updater | <agent package>/2_Update_On_Device/update_agent.sh |
| First‑time installer | <agent package>/1_First_Time_Install/run |